home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / winlib.lzh / WINLIB / DIALOG.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-09  |  4.4 KB  |  187 lines

  1. /********************************************************************
  2.  *                                                                    *
  3.  *    WinLIB PRO Revision II: Dialog manipulation module                *
  4.  *    by Ken Hollis                                                    *
  5.  *                                                                    *
  6.  *    Copyright (C) 1994, Bitgate Software                            *
  7.  *                                                                    *
  8.  ********************************************************************/
  9.  
  10. #include <aes.h>
  11. #include <stdio.h>
  12.  
  13. #include "winlib.h"
  14.  
  15. #ifdef __TURBOC__
  16. #pragma warn -pia
  17. #endif
  18.  
  19. #ifndef __DIALOG__
  20. #define __DIALOG__
  21. #endif
  22.  
  23. /*
  24.  *    Update dialog box in window
  25.  *
  26.  *    win = Window to update
  27.  *    x, y, w, h = Area to redraw
  28.  */
  29. GLOBAL void WUpdateWindowDlg(WINDOW *win, int x, int y, int w, int h, int obj)
  30. {
  31.     if (win->tree) {
  32.         GRECT own, temp;
  33.  
  34.         own.g_x = x;
  35.         own.g_y = y;
  36.         own.g_w = w;
  37.         own.g_h = h;
  38.  
  39.         wind_update(BEG_UPDATE);
  40.         wind_update(BEG_MCTRL);
  41.  
  42.         WWindGet(win, WF_FIRSTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
  43.         while (temp.g_w && temp.g_h) {
  44.             if (rc_intersect(&temp, &own))
  45.                 if ((obj == 0) || ((win->tree[obj].ob_type & 0x0F) == G_IMAGE))
  46.                     objc_draw(win->tree, 0, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
  47.                 else
  48.                     objc_draw(win->tree, obj, 2, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
  49.  
  50.             WWindGet(win, WF_NEXTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
  51.         }
  52.  
  53.         wind_update(END_MCTRL);
  54.         wind_update(END_UPDATE);
  55.     }
  56. }
  57.  
  58. GLOBAL void WUpdateWindowDlgLevel(WINDOW *win, int x, int y, int w, int h, int obj, int level)
  59. {
  60.     if (win->tree) {
  61.         GRECT own, temp;
  62.  
  63.         own.g_x = x;
  64.         own.g_y = y;
  65.         own.g_w = w;
  66.         own.g_h = h;
  67.  
  68.         wind_update(BEG_UPDATE);
  69.         wind_update(BEG_MCTRL);
  70.  
  71.         WWindGet(win, WF_FIRSTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
  72.         while (temp.g_w && temp.g_h) {
  73.             if (rc_intersect(&temp, &own))
  74.                 objc_draw(win->tree, obj, level, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
  75.  
  76.             WWindGet(win, WF_NEXTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
  77.         }
  78.  
  79.         wind_update(END_MCTRL);
  80.         wind_update(END_UPDATE);
  81.     }
  82. }
  83.  
  84. /*
  85.  *    Custom replacement for form_button
  86.  *
  87.  *    Should match pretty exactly the workings of form_button
  88.  *    except that it handles dialogboxes in windows correctly, as
  89.  *    well as being able to handle background clicks.
  90.  */
  91. GLOBAL int WForm_button(WINDOW *win, int obj, int clicks, int *nxtobj)
  92. {
  93.     OBJECT *tree = win->tree, *obptr = tree + obj;
  94.     int flags = obptr->ob_flags;
  95.     int state = obptr->ob_state;
  96.  
  97.     wind_update(BEG_MCTRL);
  98.  
  99.     if (clicks == 2) {}
  100.     if (clicks == 3) {}
  101.     if ((flags & SELECTABLE) && ! (state & DISABLED)) {
  102.         *nxtobj = obj;
  103.  
  104.         if ((flags & RBUTTON) && (state & SELECTED))
  105.             no_click();
  106.         else {
  107.             state ^= SELECTED;
  108.             if (flags & (RBUTTON | TOUCHEXIT)) {
  109.                 if (flags & SELECTABLE)
  110.                     Objc_Change(win->tree, obj, 0, state, 1);
  111.  
  112.                 if (flags & RBUTTON) {
  113.                     register int act = obj, lst, new;
  114.  
  115.                     for (;;) {
  116.                         lst = act;
  117.                         new = obptr->ob_next;
  118.  
  119.                         for (;;) {
  120.                             act = new;
  121.                             obptr = tree + act;
  122.  
  123.                             if (obptr->ob_tail == lst) {
  124.                                 new = obptr->ob_head;
  125.                                 lst = act;
  126.                             } else {
  127.                                 if (act == obj)
  128.                                     goto rb_exit;
  129.  
  130.                                 if ((obptr->ob_state & SELECTED) && (obptr->ob_flags & RBUTTON)) {
  131.                                     Objc_Change(win->tree, act, 0, obptr->ob_state ^ SELECTED, 1);
  132.                                     goto rb_exit;
  133.                                 } else
  134.                                     break;
  135.                             }
  136.                         }
  137.                     }
  138. rb_exit:            no_click();
  139.                 }
  140.             } else {
  141.                 register OBJECT *ob = tree + obj;
  142.                 EVENT event;
  143.                 int x, y, dummy, events;
  144.  
  145.                 event.ev_mflags = MU_BUTTON | MU_M1;
  146.                 event.ev_mbclicks = 1;
  147.                 event.ev_bmask = 0x11;
  148.                 event.ev_mbstate = 0;
  149.  
  150.                 objc_offset(tree, obj, &event.ev_mm1x, &event.ev_mm1y);
  151.                 event.ev_mm1width = ob->ob_width;
  152.                 event.ev_mm1height = ob->ob_height;
  153.  
  154.                 graf_mkstate(&x, &y, &dummy, &dummy);
  155.                 if (rc_inside(x, y, (GRECT *) &event.ev_mm1x)) {
  156.                     event.ev_mm1flags = 1;
  157.                     Objc_Change(win->tree, obj, 0, ob->ob_state ^ SELECTED, 1);
  158.                 } else
  159.                     event.ev_mm1flags = 0;
  160.  
  161.                 do {
  162.                     events = EvntMulti(&event);
  163.                     if (events & MU_M1)    {
  164.                         event.ev_mm1flags = 1 - event.ev_mm1flags;
  165.                         Objc_Change(win->tree, obj, 0, ob->ob_state ^ SELECTED, 1);
  166.                     }
  167.                 }
  168.                 while (!(events & MU_BUTTON));
  169.  
  170.                 if (!(ob->ob_state & SELECTED))
  171.                     *nxtobj = 0;
  172.             }
  173.         }
  174.     } else
  175.         if (flags & EDITABLE)
  176.             *nxtobj = obj;
  177.         else
  178.             *nxtobj = 0;
  179.  
  180.     wind_update(END_MCTRL);
  181.  
  182.     if (*nxtobj)
  183.         if (win->tree[*nxtobj].ob_flags & (EXIT | TOUCHEXIT))
  184.             return 0;
  185.  
  186.     return 1;
  187. }